package com.fruit.account.service.bill;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import com.fruit.mapper.account.bill.BillDetailMapper;
import com.fruit.pojo.account.bill.BillDetail;
import com.fruit.sdk.account.bill.BillDetailService;
import com.fruit.util.ResultInfo;
import com.fruit.util.ResultUtil;

/**
 * 账单明细相关服务
 * 
 * @author Administrator
 * @version 2017.11.30 11:40
 */
@Service("billDetailService")
public class BillDetailServiceImpl implements BillDetailService {
	private Logger logger = LoggerFactory.getLogger(BillDetailServiceImpl.class);
	@Autowired
	private BillDetailMapper billDetailMapper;
	// @Autowired
	// private BalanceDetailMapper balanceDetailMapper;
	// @Autowired
	// private CommissionDetailMapper commissionDetailMapper;
	// @Autowired
	// private UserAccountMapper userAccountMapper;
	// @Autowired
	// private BuyBackRuleMapper buyBackRuleMapper;
	// @Autowired
	// private UserManager userService;

	/**
	 * 批量插入账单明细
	 */
	@Override
	public Map<String, Object> insertBillForPayOnline(BillDetail record) {
		logger.info("【账单处理】---【开始】-----");
		Map<String, Object> result = new HashMap<String, Object>();
		// 1、生成账单明细
		try {
			if (record != null) {
				logger.info("【账单处理】---【params】-----" + record.toString());
				if (record.getUserId() == null) {
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数用户id不能为空!"));
					return result;
				}
				if (record.getMoney() == null) {
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数金额不能为空!"));
					return result;
				}
				if (record.getObjId() == null) {
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数订单id不能为空!"));
					return result;
				}
				if (StringUtils.isEmpty(record.getMoneyState())) {
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数进出标识不能为空!"));
					return result;
				}
				if (record.getObjId() == null) {
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数对象id不能为空!"));
					return result;
				}
				if (StringUtils.isEmpty(record.getType())) {
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数账单类型不能为空!"));
					return result;
				}
				try {
					// 1、生成订购账单明细
					logger.info("【账单处理】---【保存订购账单】-----");
					billDetailMapper.insert(record);
				} catch (Exception e) {
					logger.error("【账单处理】---【生成订购账单异常】-----");
					result.put("result",
							(ResultInfo) ResultUtil.initResult(ResultInfo.ERROR, "error", "插入账单明细异常！", "", "01"));
					return result;
				}
				logger.info("【账单处理】---【开始返销业务处理】-----");
				// //2、触发耳机分销（1.返销记录、2余额明细3更新余额4插入返销账单）
				// result =
				// ((BillDetailServiceImpl)AopContext.currentProxy()).nestedCommissionBack(record);
				// ResultInfo rsu = (ResultInfo)result.get("result");
				// if(ResultInfo.SUCCESS.equals(rsu.getState())){
				// result.put("result",
				// (ResultInfo)ResultUtil.initResult(rsu.getState(), "",
				// "操作成功"));
				// }
				logger.info("【账单处理】---【返销业务处理结束】-----");
			} else {
				logger.error("【账单处理】---【传入参数异常】-----");
				result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数不能为空!"));
			}
			return result;
		} catch (Exception e) {
			logger.error("【账单处理】---【异常】-----" + getStackTraceAsString(e));
			result.put("result", (ResultInfo) ResultUtil.initResult(ResultInfo.ERROR, "error", "未知错误！", "", "01"));
			return result;
		} finally {
			ResultInfo ri = (ResultInfo) result.get("result");
			if (ResultInfo.ROLLBACK.equals(ri.getIsRollBack())) {
				logger.info("【账单处理】---【异常事务回滚】-----");
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
			}
			logger.info("【账单处理】---【开始】-----");
		}

	}

	/**
	 * 返销业务入口
	 * 
	 * @param record
	 * @return
	 */
	// @SuppressWarnings("unchecked")
	// public Map<String, Object> nestedCommissionBack(BillDetail record) {
	// Map<String, Object> result = new HashMap<String, Object>();
	// logger.info("【返销处理】---【开始】-----");
	// try {
	// //1、触发耳机分销 获取返销规则
	// BuyBackRule recRule=new BuyBackRule();
	// recRule.setState("01");//已启用
	// recRule.setStartTime(DateUtil.getTime());
	// logger.info("【返销处理】---【获取返销规则】-----");
	// BuyBackRule bbRule=buyBackRuleMapper.selectByCondition(recRule);
	// if(bbRule!=null){//规则存在
	// //一级返销点数，二级返销点数如果获取不到，则不执行佣金返销功能
	// if(bbRule.getOneLevelRebate()==null|| bbRule.getOneLevelRebate()==null){
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "获取返销规则点数异常！","","01"));
	// return result;
	// }
	// //2、获取用户上下级 调用户中心的服务
	// Map<String,Object> userMap=null;
	// Map<String,Object> userData=null;
	// try {
	// logger.info("【返销处理】---【获取用户上下级】-----");
	// userMap=userService.getUserParent(record.getUserId());
	// if(userMap==null){
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "获取到用户上级失败","","01"));
	// return result;
	// }
	// ResultInfo userRi = (ResultInfo)userMap.get("result");
	// if(ResultInfo.ERROR.equals(userRi.getState())){
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "获取用户上级异常！","","01"));
	// return result;
	// }
	// userData=(Map<String, Object>) userMap.get("data");
	// if(userData==null||userData.size()<=0){
	// result.put("result",
	// (ResultInfo)ResultUtil.initResult(ResultInfo.SUCCESS, "",
	// "未匹配到当前用户的上级关系"));
	// return result;
	// }
	// logger.info("【返销处理】---【获取用户上下级id】-----"+userData.toString());
	// } catch (Exception e) {
	// logger.error("【返销处理】---【获取用户上下级异常】-----"+ getStackTraceAsString(e));
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "获取用户上级异常！","","01"));
	// return result;
	// }
	//
	// //3、生成返销记录
	// //构造佣金返销记录
	// List<CommissionDetail> Commlist=new ArrayList<CommissionDetail>();
	// try {
	// logger.info("【返销处理】---【构造佣金返销记录】---【开始】---");
	// if(StringUtils.isNotEmpty((String) userData.get("parentOne"))){
	// logger.info("【返销处理】---【构造佣金返销记录】---【当前用户上级id】-----"+(String)
	// userData.get("parentOne"));
	// //构建一级级返销记录即一级返销
	// CommissionDetail commDetail=new CommissionDetail();
	// commDetail.setUserId(Integer.valueOf((String)
	// userData.get("parentOne")));// 当前用户上级id
	// BigDecimal OneBackMoney=record.getMoney().multiply(new
	// BigDecimal(bbRule.getOneLevelRebate())).divide(new
	// BigDecimal(100),3,BigDecimal.ROUND_HALF_UP);
	// commDetail.setMoney(OneBackMoney.setScale(2,
	// BigDecimal.ROUND_HALF_UP));// 更换为消费金额乘以返销点数
	// commDetail.setRebate(bbRule.getOneLevelRebate());//一级返销点数
	// commDetail.setOrderId(record.getObjId());//交易订单id
	// commDetail.setFriendId(record.getUserId());//一级返销为当前用户id
	// commDetail.setLevel("01");//01 一级；02二级
	// commDetail.setCreateTime(DateUtil.getTime());
	// commDetail.setRemark("一级返销");
	// Commlist.add(commDetail);
	// }
	// if(StringUtils.isNotEmpty((String) userData.get("parentTow"))){
	// logger.info("【返销处理】---【构造佣金返销记录】---【当前用户上级的上级id】-----"+(String)
	// userData.get("parentTow"));
	// //构建上上级返销记录即二级返销
	// CommissionDetail commDetailP=new CommissionDetail();
	// commDetailP.setUserId(Integer.valueOf((String)
	// userData.get("parentTow")));// 当前用户上上级id
	// BigDecimal twoBackMoney=record.getMoney().multiply(new
	// BigDecimal(bbRule.getTwoLevelRebate())).divide(new
	// BigDecimal(100),3,BigDecimal.ROUND_HALF_UP);
	// commDetailP.setMoney(twoBackMoney.setScale(2,
	// BigDecimal.ROUND_HALF_UP));//消费金额乘以返销点数
	// commDetailP.setRebate(bbRule.getTwoLevelRebate());//二级返销点数
	// commDetailP.setOrderId(record.getObjId());//交易订单id
	// commDetailP.setFriendId(Integer.valueOf((String)
	// userData.get("parentOne")));//二级返销为当前用户的上级id
	// commDetailP.setLevel("02");//01 一级；02二级
	// commDetailP.setCreateTime(DateUtil.getTime());
	// commDetailP.setRemark("二级返销");
	// Commlist.add(commDetailP);
	// }
	// if(Commlist.size()<=0){
	// logger.info("【返销处理】---【构造佣金返销记录】---【当前用户不存在上级】-----");
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "生成返销记录异常！"));
	// return result;
	// }
	// logger.info("【返销处理】---【构造佣金返销记录】---【saveparams】-----"+Commlist.toString());
	// //保存返销记录
	// commissionDetailMapper.insertCommissionDetails(Commlist);
	// logger.info("【返销处理】---【构造佣金返销记录】---【结束】-----");
	// } catch (Exception e) {
	// logger.error("【返销处理】---【构造佣金返销记录】---【生成返销记录异常！】-----"+
	// getStackTraceAsString(e));
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "生成返销记录异常！","","01"));
	// return result;
	// }
	// //4、生成返销记录账单明细
	// //构建返销记录账单明细
	// List<BillDetail> backBills=new ArrayList<BillDetail>();
	// try {
	// logger.info("【返销处理】---【返销记录账单明细】---【开始】-----");
	// for(CommissionDetail comm:Commlist){
	// //账单明细
	// BillDetail pBill=new BillDetail();
	// pBill.setUserId(comm.getUserId());
	// pBill.setType("02");//返销
	// pBill.setMoney(comm.getMoney());//返销金额
	// pBill.setMoneyState("01");//增加
	// pBill.setObjId(comm.getId());//返销记录id
	// pBill.setCreateTime(DateUtil.getTime());
	// pBill.setRemark(comm.getRemark());
	// backBills.add(pBill);
	// }
	// logger.info("【返销处理】---【返销记录账单明细】---【saveparams】-----"+backBills.toString());
	// if(backBills.size()<=0){
	// logger.info("【返销处理】---【返销记录账单明细】---【构建返销记录账单明细为空】-----");
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "生成返销记录入参异常！","","01"));
	// return result;
	// }
	// //保存返销记录账单明细
	// billDetailMapper.insertBillDetails(backBills);
	// logger.info("【返销处理】---【返销记录账单明细】---【结束】-----");
	// } catch (Exception e) {
	// logger.error("【返销处理】---【返销记录账单明细】---【生成返销记录账单明细异常！】-----"+
	// getStackTraceAsString(e));
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "生成返销记录账单明细异常！","","01"));
	// return result;
	// }
	// //构建修改用户余额
	// List<UserAccount> uList=new ArrayList<UserAccount>();
	// //5、生成余额明细
	// try {
	// logger.info("【返销处理】---【返销余额明细】---【开始】-----");
	// //构建返销余额明细
	// List<BalanceDetail> balancelist =new ArrayList<BalanceDetail>();
	// for(BillDetail bd:backBills){
	// //余额明细
	// BalanceDetail balance=new BalanceDetail();
	// balance.setUserId(bd.getUserId());
	// balance.setMoney(bd.getMoney());
	// balance.setIncomeState("01");//增加
	// balance.setBillId(bd.getId());
	// balance.setType("03");//返销
	// balance.setRemark(bd.getRemark());
	// balance.setCreateTime(DateUtil.getTime());
	// balancelist.add(balance);
	//
	// //用户账单余额
	// UserAccount uAccount=new UserAccount();
	// uAccount.setUserId(bd.getUserId());
	// uAccount.setBalance(bd.getMoney());//本次变动余额
	// uList.add(uAccount);
	// }
	// logger.info("【返销处理】---【返销余额明细】---【saveparams】-----"+balancelist.toString());
	// if(balancelist.size()<=0){
	// logger.info("【返销处理】---【返销余额明细】---【构建返销余额明细异常】-----");
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "构建返销余额明细异常！","","01"));
	// return result;
	// }
	// //保存余额明细
	// balanceDetailMapper.insertBalanceDetails(balancelist);
	// logger.info("【返销处理】---【返销余额明细】---【结束】-----");
	// } catch (Exception e) {
	// logger.error("【返销处理】---【返销余额明细】---【生成返销记录余额明细异常！】-----"+
	// getStackTraceAsString(e));
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "生成返销记录余额明细异常！","","01"));
	// return result;
	// }
	//
	// //6、修改用户账户余额
	// try {
	// logger.info("【返销处理】---【开始用户账户余额修改】---【saveparams】-----"+uList.toString());
	// if(uList.size()<=0){
	// logger.info("【返销处理】---【用户账户余额修改】---【构建参数异常】----");
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "更新用户账户余额入参异常！","","01"));
	// return result;
	// }
	// //修改用户账户余额
	// int rec=userAccountMapper.updateByUserIdBach(uList);
	// if(uList.size()!=rec){
	// logger.info("【返销处理】---【用户账户余额修改】---【更新用户账户余额失败！】----影响记录数：="+rec);
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "更新用户账户余额异常！","","01"));
	// return result;
	// }
	// logger.info("【返销处理】---【用户账户余额修改】---【结束】-----");
	// } catch (Exception e) {
	// logger.error("【返销处理】---【用户账户余额修改】---【更新用户账户余额异常！】-----"+
	// getStackTraceAsString(e));
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "更新用户账户余额异常！","","01"));
	// return result;
	// }
	// result.put("result", ResultUtil.initResult(ResultInfo.SUCCESS, "",
	// "返销业务操作成功"));
	// }else{
	// result.put("result", ResultUtil.initResult(ResultInfo.SUCCESS, "",
	// "未匹配到返销业务规则"));
	// }
	// return result;
	// } catch (Exception e) {
	// logger.error("【返销处理】---【异常】-----"+ getStackTraceAsString(e));
	// result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR,
	// "error", "获取分销规则异常！","","01"));
	// return result;
	// } finally {
	// ResultInfo ri = (ResultInfo)result.get("result");
	// if(ResultInfo.ROLLBACK.equals(ri.getIsRollBack())){
	// logger.info("【返销处理】---【异常事务回滚】-----");
	// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
	// }
	// logger.info("【返销处理】---【结束】-----");
	// }
	// }
	/**
	 * 将ErrorStack转化为String.
	 * @param ex 异常
	 * @return 异常字符串
	 */
	public static String getStackTraceAsString(Throwable ex) {
		StringWriter stringWriter = new StringWriter();
		ex.printStackTrace(new PrintWriter(stringWriter));
		return stringWriter.toString();
	}

}
